// 第一步初始化我们的包
// 第二步搭建服务器
// 第三步连接数据库
// 引入http
const http = require('http')
const app = http.createServer();

//解析post请求数据
const querystring = require('querystring')
//解析get传递过来的数据
const url = require('url')



// 引入mongoose 连接数据库
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/playground',{
    useNewUrlParser: true,
    useUnifiedTopology: true 
}).then(()=>{
    console.log('数据库连接成功');
}).catch((err)=>{
    console.log(err,'数据库连接失败');
})

//创建集合规则
const myinfor = new mongoose.Schema({
    name:{
        required:true,
        type:String,
        minlength:[2,'最小值不能小于2'],
        maxlength:[100,'最大值不能超过100个']
    },
    age:{
        type:Number,
        min:[5,'年龄不能小于5岁'],
        max:[100,'年龄不能大于100岁']
    },
    sex:String,
    email:String,
    hobbies:[String],
    collage:String,
    enterDate:{
        type:Date,
        default:Date.now
    }
})
//调用创建的集合规则进行创建集合名字
const myInfor = mongoose.model('Myinfor',myinfor)

// 1 安装模板引擎 art-template npm i art-template
// 2 引入art-template
const template = require('art-template')
// 引入path模块
const path = require('path')
// 配置一下根路径
template.defaults.root = path.join(__dirname,'views')
/* 格式化时间
1 安装第三方模块 npm i dateformat
2 引入 dateformat
3 自定义格式化方法名字
*/
const dateFormat = require('dateformat')
template.defaults.imports.myformat = dateFormat



// 静态资源托管 一般我们需要托管的是第三方的 css less img
// 托管css
// 1 安装 npm i serve-static
// 2 引入 serve-static
// 3 使用serve-static的返回值serveStatic进行静态资源托管
// 4 把托管后的返回值在服务器上挂载
const serveStatic = require('serve-static')
// 进行静态资源托管
const serve = serveStatic(path.join(__dirname,'public'))




//实现node js的路由功能(调用第三方模块 安装 npm i router)
// 1 引入router
const Router = require('router')
// 2 调用Router的返回值
const router = Router()
// 3 测试路由功能(监听路由，可以监听到get请求)
router.get('/list',async (req,res)=>{
    // list路由
    /* 
         get /list路由的时候
         1 从数据库里面读取数据 find
         2 把读取到的数据 采用模板引擎展示出来
    */
   //第一种方法
  /*  myInfor.find({}).then(res=>{
       console.log(res);
   })
    res.end('get list') */
    let allData = await myInfor.find({})
    console.log(allData);

    //把数组包装成对象
    let obj = {
        myallData:allData
    }
    let html = template('list.art',obj)
    res.end(html)
    
})
router.get('/add',(req,res)=>{
    // get 请求 进入到/add 这个路由的时候需要加载我们添加数据页面
    // template('第一参数是需要加载模板路径','第二个参数是我们需要加载的数据')
    let html = template('index.art',{})
    console.log(html);
    res.end(html)
})

// post 提交 特别是表单提交 一定要有name属性
//post请求 表单提交  路由来监听post /add的路由 
router.post('/add',(req,res)=>{
    // post 请求提交数据 获取post提交过来的参数
    // 请求的时候两个方法 一个是正在传输数据data 一个是传输完毕之后的end方法
    let formData = ''
    req.on('data',(params)=>{
        formData+=params
    })
    req.on('end',async ()=>{
        // console.log(formData);
        let data = querystring.parse(formData)
        // console.log(data);

        // 向我们的数据库里面添加数据
       let newData = await myInfor.create(data)
    //    console.log(newData);
       
    })

    // 跳转到/list路由 301表示重定向到/list
    res.writeHead(301,{
        Location:'/list'
    })

    res.end() //必须要有end
})

//删除功能
router.get('/remove',async (req,res)=>{
    /*
        1 获取当前传递过来的id
        2 根据id去数据库里面查询
        3 重新加载当前页面 重新跳转
    */
   const myid = url.parse(req.url,true).query.id
   console.log(myid);
   

   let del =  await  myInfor.deleteOne({
       _id:myid
   })
   
   res.writeHead(301,{
       Location:'/list'
   })
    res.end()
})


//修改功能 更新功能
router.get('/modify',async (req,res)=>{
    let myid = url.parse(req.url,true).query.id
    console.log(myid);
    
   /*  获取get 传递过来的id
    根据id 去数据库里面查询对应的数据
    把查询出来的数据 通过模板引擎进行展示 */

    let findone = await myInfor.findOne({
        _id:myid
    })
    console.log(findone);
    
    let html = template('index2.art',findone)

    // res.end(html)
    res.end(html)
})

//第二部分就是更新数据，修改数据
router.post('/modify',(req,res)=>{
    let myid = url.parse(req.url,true).query.id
    console.log(myid);
    
    let modifyData = ''
    req.on('data',(params)=>{
        modifyData+=params
    })
    req.on('end',async ()=>{
        let obj =  querystring.parse(modifyData)
        console.log(obj);
        
        let updata = await  myInfor.updateOne({ //修改之后的数据
            _id:myid
        },obj)
        console.log(updata);
        
    })
    res.writeHead(301,{
        Location:'/list'
    })
    res.end()
})





app.on('request',(req,res)=>{

    // 4 路由进行挂载 需要挂载到服务器上
    router(req,res,()=>{ //回调函数必须写 可以什么内容也不写
        // console.log('路由触发了');
    })

    serve(req, res, () => { //回调函数必须写 可以什么内容也不写
        // console.log('css静态资源托管');
    })

    // res.end('ok')
})
app.listen(7777,()=>{
    console.log('http://localhost:7777');
})